using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using twistmachinev2.OPCUA;

namespace twistmachinev2.TwistControl
{
    /// <summary>
    /// 支持数据绑定的TextBox控件
    /// 可以直接关联DynamicDataModel中的属性，实现自动数据更新
    /// </summary>
    public class DataBindingTextBox : TextBox
    {
        #region 私有字段
        private DynamicDataModel _dataModel;
        private string _propertyName;
        private string _displayFormat;
        private object _defaultValue;
        private bool _isUpdating = false;
        private Timer _updateTimer;
        #endregion

        #region 公共属性
        /// <summary>
        /// 关联的数据模型
        /// </summary>
        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public DynamicDataModel DataModel
        {
            get { return _dataModel; }
            set
            {
                if (_dataModel != value)
                {
                    // 取消旧模型的事件订阅
                    if (_dataModel != null)
                    {
                        _dataModel.PropertyChanged -= OnDataModelPropertyChanged;
                    }

                    _dataModel = value;

                    // 订阅新模型的事件
                    if (_dataModel != null)
                    {
                        _dataModel.PropertyChanged += OnDataModelPropertyChanged;
                    }

                    // 立即更新显示
                    UpdateDisplay();
                }
            }
        }

        /// <summary>
        /// 关联的属性名称
        /// </summary>
        [Category("Data Binding")]
        [Description("要绑定的数据模型属性名称，点击右侧按钮可从OPC UA节点中选择")]
        [Editor(typeof(PropertyNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public string PropertyName
        {
            get { return _propertyName; }
            set
            {
                if (_propertyName != value)
                {
                    _propertyName = value;
                    UpdateDisplay();
                }
            }
        }

        /// <summary>
        /// 显示格式（用于数值格式化）
        /// </summary>
        [Category("Data Binding")]
        [Description("数据显示格式，如F2表示保留2位小数")]
        public string DisplayFormat
        {
            get { return _displayFormat; }
            set
            {
                if (_displayFormat != value)
                {
                    _displayFormat = value;
                    UpdateDisplay();
                }
            }
        }

        /// <summary>
        /// 默认值（当数据为空或获取失败时显示）
        /// </summary>
        [Category("Data Binding")]
        [Description("当数据为空或获取失败时显示的默认值")]
        public object DefaultValue
        {
            get { return _defaultValue; }
            set
            {
                if (_defaultValue != value)
                {
                    _defaultValue = value;
                    UpdateDisplay();
                }
            }
        }

        /// <summary>
        /// 是否启用自动更新（定时刷新显示）
        /// </summary>
        [Category("Data Binding")]
        [Description("是否启用定时自动更新显示")]
        [DefaultValue(false)]
        public bool AutoUpdate { get; set; } = false;

        /// <summary>
        /// 自动更新间隔（毫秒）
        /// </summary>
        [Category("Data Binding")]
        [Description("自动更新间隔，单位毫秒")]
        [DefaultValue(1000)]
        public int UpdateInterval { get; set; } = 1000;

        /// <summary>
        /// 数据前缀文本
        /// </summary>
        [Category("Data Binding")]
        [Description("显示在数据前面的前缀文本")]
        public string PrefixText { get; set; } = string.Empty;

        /// <summary>
        /// 数据后缀文本
        /// </summary>
        [Category("Data Binding")]
        [Description("显示在数据后面的后缀文本")]
        public string SuffixText { get; set; } = string.Empty;
        #endregion

        #region 构造函数
        public DataBindingTextBox()
        {
            // 设置默认属性
            ReadOnly = false;  // 允许用户编辑
            BackColor = SystemColors.Window;
            
            // 初始化更新定时器
            _updateTimer = new Timer();
            _updateTimer.Tick += UpdateTimer_Tick;
        }
        #endregion

        #region 公共方法
        /// <summary>
        /// 手动更新显示
        /// </summary>
        public void RefreshDisplay()
        {
            UpdateDisplay();
        }

        /// <summary>
        /// 设置数据绑定
        /// </summary>
        /// <param name="dataModel">数据模型</param>
        /// <param name="propertyName">属性名称</param>
        /// <param name="displayFormat">显示格式</param>
        /// <param name="defaultValue">默认值</param>
        public void SetDataBinding(DynamicDataModel dataModel, string propertyName, string displayFormat = null, object defaultValue = null)
        {
            PropertyName = propertyName;
            DisplayFormat = displayFormat;
            DefaultValue = defaultValue;
            DataModel = dataModel; // 最后设置，触发更新
        }

        /// <summary>
        /// 启动自动更新
        /// </summary>
        public void StartAutoUpdate()
        {
            if (AutoUpdate && UpdateInterval > 0)
            {
                _updateTimer.Interval = UpdateInterval;
                _updateTimer.Start();
            }
        }

        /// <summary>
        /// 停止自动更新
        /// </summary>
        public void StopAutoUpdate()
        {
            _updateTimer.Stop();
        }
        #endregion

        #region 私有方法
        /// <summary>
        /// 更新显示内容
        /// </summary>
        private void UpdateDisplay()
        {
            if (_isUpdating) return;

            try
            {
                _isUpdating = true;

                if (_dataModel == null || string.IsNullOrEmpty(_propertyName))
                {
                    Text = GetDefaultDisplayText();
                    return;
                }

                var value = _dataModel.GetValue(_propertyName);
                Text = FormatValue(value);
            }
            catch (Exception ex)
            {
                // 发生异常时显示默认值
                Text = GetDefaultDisplayText();
                System.Diagnostics.Debug.WriteLine($"DataBindingTextBox更新显示失败: {ex.Message}");
            }
            finally
            {
                _isUpdating = false;
            }
        }

        /// <summary>
        /// 格式化值
        /// </summary>
        private string FormatValue(object value)
        {
            if (value == null)
            {
                return GetDefaultDisplayText();
            }

            string formattedValue;

            // 应用格式化
            if (!string.IsNullOrEmpty(_displayFormat) && value is IFormattable formattable)
            {
                formattedValue = formattable.ToString(_displayFormat, null);
            }
            else
            {
                formattedValue = value.ToString();
            }

            // 添加前缀和后缀
            return $"{PrefixText}{formattedValue}{SuffixText}";
        }

        /// <summary>
        /// 获取默认显示文本
        /// </summary>
        private string GetDefaultDisplayText()
        {
            var defaultText = _defaultValue?.ToString() ?? "--";
            return $"{PrefixText}{defaultText}{SuffixText}";
        }

        /// <summary>
        /// 数据模型属性变化事件处理
        /// </summary>
        private void OnDataModelPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            // 只有当变化的属性是我们关注的属性时才更新
            if (e.PropertyName == _propertyName || string.IsNullOrEmpty(e.PropertyName))
            {
                if (InvokeRequired)
                {
                    Invoke(new Action(UpdateDisplay));
                }
                else
                {
                    UpdateDisplay();
                }
            }
        }

        /// <summary>
        /// 自动更新定时器事件
        /// </summary>
        private void UpdateTimer_Tick(object sender, EventArgs e)
        {
            UpdateDisplay();
        }
        #endregion

        #region 重写方法
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            
            // 控件创建后启动自动更新
            if (AutoUpdate)
            {
                StartAutoUpdate();
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                // 清理资源
                StopAutoUpdate();
                _updateTimer?.Dispose();
                
                if (_dataModel != null)
                {
                    _dataModel.PropertyChanged -= OnDataModelPropertyChanged;
                }
            }
            base.Dispose(disposing);
        }
        #endregion
    }
}